// src/stores/user.js
import { defineStore } from 'pinia';

/**
 * 安全解析JSON字符串的工具函数
 * @param {string} jsonString - 要解析的JSON字符串
 * @param {any} defaultValue - 解析失败或为空时的默认值
 * @returns {any} 解析后的对象或默认值
 */
function safeParse(jsonString, defaultValue = null) {
  try {
    // 处理空字符串、null或"undefined"字符串的情况
    if (!jsonString || jsonString === 'undefined') {
      return defaultValue;
    }
    // 尝试解析JSON字符串
    return JSON.parse(jsonString);
  } catch (error) {
    // 解析失败时记录错误并返回默认值
    console.error('解析本地存储JSON失败:', error);
    return defaultValue;
  }
}

/**
 * 用户状态管理Store
 * 管理用户登录状态、用户信息等
 */
export const useUserStore = defineStore('user', {
  // 定义状态数据
  state: () => ({
    /**
     * 当前用户信息
     * 从本地存储获取，默认值通过safeParse处理
     */
    currentUser: safeParse(localStorage.getItem('user')),
    
    /**
     * 登录状态
     * 从本地存储获取，默认值为false
     */
    isLoggedIn: safeParse(localStorage.getItem('isLoggedIn'), false),
    
    /**
     * 认证令牌
     * 从本地存储获取，默认空字符串
     */
    token: localStorage.getItem('token') || ''
  }),
  
  // 定义状态操作方法
  actions: {
    /**
     * 设置用户登录状态
     * @param {object} user - 用户信息对象
     * @param {string} [token] - 认证令牌（可选）
     */
    setUser(user, token = '') {
      this.currentUser = user;
      this.isLoggedIn = true;
      this.token = token;
      
      // 存储到本地存储
      localStorage.setItem('user', JSON.stringify(user));
      localStorage.setItem('isLoggedIn', JSON.stringify(true));
      if (token) {
        localStorage.setItem('token', token);
      }
    },
    
    /**
     * 处理用户登录
     * @param {object} user - 用户信息对象
     * @param {string} [token] - 认证令牌（可选）
     */
    login(user, token = '') {
      this.setUser(user, token);
    },
    
    /**
     * 处理用户退出登录
     */
    logout() {
      this.currentUser = null;
      this.isLoggedIn = false;
      this.token = '';
      
      // 清除本地存储
      localStorage.removeItem('user');
      localStorage.removeItem('isLoggedIn');
      localStorage.removeItem('token');
    },
    
    /**
     * 设置认证令牌
     * @param {string} token - 认证令牌
     */
    setToken(token) {
      this.token = token;
      localStorage.setItem('token', token);
    },
    
    /**
     * 更新用户信息
     * @param {object} user - 新的用户信息对象
     */
    updateUser(user) {
      this.currentUser = { ...this.currentUser, ...user };
      localStorage.setItem('user', JSON.stringify(this.currentUser));
    }
  },
  
  // 定义getters（计算属性）
  getters: {
    /**
     * 获取当前用户ID
     * @returns {number|undefined} 用户ID，未登录时为undefined
     */
    getUserId() {
      return this.currentUser?.id;
    },
    
    /**
     * 获取当前用户名
     * @returns {string|string} 用户名，未登录时为"游客"
     */
    getUserName() {
      return this.currentUser?.username || '游客';
    },
    
    /**
     * 检查是否为管理员
     * @returns {boolean} 是否为管理员
     */
    isAdmin() {
      return this.currentUser?.role === 'admin';
    }
  }
});

/* 使用示例 */
// 错误示例：不要直接存储undefined
// localStorage.setItem('user', JSON.stringify(undefined)); 

// 正确示例：存储有效的用户对象
// const userData = { id: 1, username: 'John', role: 'user' };
// localStorage.setItem('user', JSON.stringify(userData));